From: Wei Liu Date: Mon, 9 Jun 2014 12:43:19 +0000 (+0100) Subject: libxl_json: introduce libxl__object_from_json X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~4874 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=185123b72e122708d54451347ebcb6f83988014e;p=xen.git libxl_json: introduce libxl__object_from_json Given a JSON string, we need to convert it to libxl_FOO struct. The approach is: JSON string -> libxl__json_object -> libxl_FOO struct With this approach we can make use of libxl's infrastructure to do the first half (JSON string -> libxl__json_object). Second half is done by auto-generated code by libxl's IDL infrastructure. IDL patch(es) will come later. Signed-off-by: Wei Liu Acked-by: Ian Campbell --- diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 5968485b52..80ea88350a 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1640,6 +1640,14 @@ typedef struct libxl__json_object { struct libxl__json_object *parent; } libxl__json_object; +typedef int (*libxl__json_parse_callback)(libxl__gc *gc, + libxl__json_object *o, + void *p); +_hidden int libxl__object_from_json(libxl_ctx *ctx, const char *type, + libxl__json_parse_callback parse, + void *p, + const char *s); + typedef struct { char *map_key; libxl__json_object *obj; diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c index 30cfd2030b..8440498ee6 100644 --- a/tools/libxl/libxl_json.c +++ b/tools/libxl/libxl_json.c @@ -802,6 +802,36 @@ out: return s; } +int libxl__object_from_json(libxl_ctx *ctx, const char *type, + libxl__json_parse_callback parse, + void *p, const char *s) +{ + GC_INIT(ctx); + libxl__json_object *o; + int rc; + + o = libxl__json_parse(gc, s); + if (!o) { + LOG(ERROR, + "unable to generate libxl__json_object from JSON representation of %s.", + type); + rc = ERROR_FAIL; + goto out; + } + + rc = parse(gc, o, p); + if (rc) { + LOG(ERROR, "unable to convert libxl__json_object to %s. (rc=%d)", type, rc); + rc = ERROR_FAIL; + goto out; + } + + rc = 0; +out: + GC_FREE; + return rc; +} + /* * Local variables: * mode: C